Commit 52643069 authored by Carsten  Rose's avatar Carsten Rose
Browse files

Merge branch 'develop' into 'master'

Refs #12615. Implements silent HEIC/HEIF conversion to png. Write a note in...

See merge request !355
parents 768c8a93 ae52d966
Pipeline #5376 passed with stages
in 3 minutes and 22 seconds
......@@ -564,7 +564,6 @@ class Save {
$this->store->unsetVar(VAR_FILE_MIME_TYPE, STORE_VAR);
$this->store->unsetVar(VAR_FILE_SIZE, STORE_VAR);
} else {
$this->store->appendToStore($vars, STORE_VAR);
}
......@@ -991,6 +990,7 @@ class Save {
$reader->setLoadSheetsOnly($importNamedSheetsOnly);
}
// Debug option importListSheetNames=1 will list all recognized sheetnames and stops import.
if (($formElement[FE_IMPORT_LIST_SHEET_NAMES] ?? '0') != '0') {
$sheetNames = $reader->listWorksheetNames($fileName);
throw new \UserFormException("Worksheets: " . implode(', ', $sheetNames),
......@@ -1155,6 +1155,30 @@ class Save {
$chmodFile = octdec($formElement[FE_FILE_CHMOD_FILE]);
}
if(1){
// HEIC conversion?
if (strpos($statusUpload['type']??'', 'image/heic') !== false) {
$cmd = $this->store->getVar(SYSTEM_CMD_HEIF_CONVERT, STORE_SYSTEM);
if (!empty($cmd )) {
exec("$cmd -q 100 $pathFileName $pathFileName.png", $output, $return_var);
if ($return_var == 0) {
HelperFile::unlink($pathFileName);
$pathFileName.='.png';
$statusUpload['type'] = 'image/png';
$statusUpload['name'] .= '.png';
} else {
$msg = error_get_last();
throw new \UserFormException(
json_encode([ERROR_MESSAGE_TO_USER => 'Upload: HEIC conversion failed', ERROR_MESSAGE_TO_DEVELOPER => $msg .'\nFile: '. $pathFileName]),
ERROR_UPLOAD_FILE_TYPE);
}
}
// Update STORE_VAR
$this->store->appendToStore(HelperFile::pathinfo($pathFileName), STORE_VAR);
$this->store->setVar(VAR_FILE_DESTINATION, $pathFileName, STORE_VAR);
}
}
$this->autoOrient($formElement, $pathFileName);
HelperFile::chmod($pathFileName, $chmodFile);
......
......@@ -454,6 +454,7 @@ class Config {
SYSTEM_CMD_GS => 'gs',
SYSTEM_CMD_PDFUNITE => 'pdfunite',
SYSTEM_CMD_IMG2PDF => 'img2pdf',
SYSTEM_CMD_HEIF_CONVERT => 'heif-convert',
SYSTEM_THUMBNAIL_DIR_SECURE_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT,
SYSTEM_THUMBNAIL_DIR_PUBLIC_REL_TO_APP => Path::APP_TO_SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT,
......
......@@ -15,6 +15,7 @@ use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser;
use IMATHUZH\Qfq\Core\Helper\Logger;
use IMATHUZH\Qfq\Core\Helper\Sanitize;
use IMATHUZH\Qfq\Core\Helper\Support;
use IMATHUZH\Qfq\Core\Helper\OnString;
/**
* Class FillStoreForm
......@@ -367,7 +368,10 @@ class FillStoreForm {
if ($formElement[FE_ENCODE] === FE_ENCODE_SPECIALCHAR) {
// $value = htmlspecialchars($value, ENT_QUOTES);
$value = Support::htmlEntityEncodeDecode(MODE_ENCODE, $value);
} elseif ($formElement[FE_ENCODE] === FE_ENCODE_SINGLE_TICK) {
$value = OnString::escapeSingleTickInHtml($value);
}
}
break;
}
......
......@@ -104,8 +104,6 @@ class Store {
CLIENT_SIP => SANITIZE_ALLOW_ALNUMX,
CLIENT_TYPO3VARS => SANITIZE_ALLOW_ALNUMX,
CLIENT_RECORD_ID => SANITIZE_ALLOW_DIGIT,
CLIENT_KEY_SEM_ID => SANITIZE_ALLOW_DIGIT,
CLIENT_KEY_SEM_ID_USER => SANITIZE_ALLOW_DIGIT,
CLIENT_PAGE_ID => SANITIZE_ALLOW_DIGIT,
CLIENT_PAGE_TYPE => SANITIZE_ALLOW_DIGIT,
CLIENT_PAGE_LANGUAGE => SANITIZE_ALLOW_DIGIT,
......
......@@ -77,7 +77,7 @@ CREATE TABLE IF NOT EXISTS `FormElement`
'beforeSave', 'beforeInsert', 'beforeUpdate', 'beforeDelete', 'afterLoad', 'afterSave',
'afterInsert', 'afterUpdate', 'afterDelete', 'sendMail', 'paste') NOT NULL DEFAULT 'text',
`subrecordOption` SET ('edit', 'delete', 'new') NOT NULL DEFAULT '',
`encode` ENUM ('none', 'specialchar') NOT NULL DEFAULT 'specialchar',
`encode` ENUM ('none', 'specialchar', 'single tick') NOT NULL DEFAULT 'specialchar',
`checkType` ENUM ('auto', 'alnumx', 'digit', 'numerical', 'email', 'pattern', 'allbut',
'all') NOT NULL DEFAULT 'auto',
`checkPattern` VARCHAR(255) NOT NULL DEFAULT '',
......
......@@ -248,3 +248,61 @@ BEGIN
Return temp_string;
END;
###
# QENT_SQUOTE(text)
# Replaces single tick by html entity '
#
DROP FUNCTION IF EXISTS `QENT_SQUOTE`;
CREATE FUNCTION `QENT_SQUOTE`(`input` TEXT) RETURNS text CHARSET utf8
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE output TEXT;
SET output = REPLACE(input, "'", ''');
RETURN output;
End;
###
# QENT_DQUOTE(text)
# Replaces double tick by html entity "
#
DROP FUNCTION IF EXISTS `QENT_DQUOTE`;
CREATE FUNCTION `QENT_DQUOTE`(`input` TEXT) RETURNS text CHARSET utf8
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE output TEXT;
SET output = REPLACE(input, '"', '"');
RETURN output;
END;
###
# QENT_DQUOTE(text)
# Replaces double tick by html entity "
#
DROP FUNCTION IF EXISTS `QESC_SQUOTE`;
CREATE FUNCTION `QESC_SQUOTE`(`input` TEXT) RETURNS text CHARSET utf8
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE output TEXT;
SET output = REPLACE(REPLACE(input, "'", "\\'"), "\\\\'", "\\'");
RETURN output;
END;
###
# QENT_DQUOTE(text)
# Replaces double tick by html entity "
#
DROP FUNCTION IF EXISTS `QESC_DQUOTE`;
CREATE FUNCTION `QESC_DQUOTE`(`input` TEXT) RETURNS text CHARSET utf8
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE output TEXT;
SET output = REPLACE(REPLACE(input, '"', '\\"'), '\\\\"', '\\"');
RETURN output;
END;
......@@ -6,8 +6,6 @@
namespace IMATHUZH\Qfq\Tests\Unit\Core;
use IMATHUZH\Qfq\Core\BuildFormPlain;
use IMATHUZH\Qfq\Core\Helper\Path;
use IMATHUZH\Qfq\Core\Helper\Support;
use IMATHUZH\Qfq\Core\QuickFormQuery;
use IMATHUZH\Qfq\Tests\Unit\Core\Database\AbstractDatabaseTest;
......@@ -395,6 +393,7 @@ class BuildFormPlainTest extends AbstractDatabaseTest {
$form = array();
$formElement = array();
$json = array();
$baseUrl = $this->store->getVar(SYSTEM_BASE_URL, STORE_SYSTEM);
$this->templateFormNFormElement($form, $formElement);
$formElement = Support::setFeDefaults($formElement);
......@@ -478,7 +477,7 @@ class BuildFormPlainTest extends AbstractDatabaseTest {
// _id: 1, icon: bullet-green.gif
$formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "bullet-green.gif" AS "Status|icon" FROM Person ORDER BY id LIMIT 2');
$result = $build->buildSubrecord($formElement, 'name:1', '', $json);
$this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" id="1-123" ><thead><tr><th>Status</th></tr></thead><tbody ><tr class="record" ><td><image src=\'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxx/qfq/typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr><tr class="record" ><td><image src=\'http://xxxxxxxxxxxxxxxxxxxxxxxxxxxx/qfq/typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr></tbody></table>', $result);
$this->assertEquals('<table class="' . SUBRECORD_TABLE_CLASS_DEFAULT . '" id="1-123" ><thead><tr><th>Status</th></tr></thead><tbody ><tr class="record" ><td><image src=\'' . $baseUrl . 'typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr><tr class="record" ><td><image src=\'' . $baseUrl . 'typo3conf/ext/qfq/Resources/Public/icons/bullet-green.gif\'></td></tr></tbody></table>', $result);
// _id: 1, mailto: john@doe.com
$formElement['sql1'] = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT id AS "_id", "john@doe.com" AS "EMail|mailto" FROM Person ORDER BY id LIMIT 2');
......
......@@ -600,42 +600,6 @@ class EvaluateTest extends AbstractDatabaseTest {
$eval->parse('go {{unknownVar:S::X}} stop');
}
/**
* @throws \CodeException
* @throws \DbException
* @throws \UserFormException
* @throws \UserReportException
*/
public function testGetEuropeanTimezone() {
$eval = new Evaluate($this->store, $this->dbArray[DB_INDEX_DEFAULT]);
// It seems in phpunit there is no default time zone set - set it manually.
date_default_timezone_set('Europe/Berlin');
# Check 2020 incl. hour
$this->assertEquals('CET', $eval->getEuropeanTimezone('29.03.2020 01:00'));
$this->assertEquals('CEST', $eval->getEuropeanTimezone('29.03.2020 03:00'));
$this->assertEquals('CEST', $eval->getEuropeanTimezone('25.10.2020 01:00'));
$this->assertEquals('CET', $eval->getEuropeanTimezone('25.10.2020 03:00'));
# Check 2021 incl. hour
$this->assertEquals('CET', $eval->getEuropeanTimezone('28.03.2021 01:00'));
$this->assertEquals('CEST', $eval->getEuropeanTimezone('28.03.2021 03:00'));
$this->assertEquals('CEST', $eval->getEuropeanTimezone('31.10.2021 01:00'));
$this->assertEquals('CET', $eval->getEuropeanTimezone('31.10.2021 03:00'));
# Check 2021 only date
$this->assertEquals('CET', $eval->getEuropeanTimezone('28.03.2021'));
$this->assertEquals('CEST', $eval->getEuropeanTimezone('29.03.2021'));
$this->assertContains($eval->getEuropeanTimezone(''), ['CET', 'CEST']);
# Check if action parameter 't' is recognized.
$this->store->setVar('start', '02.06.2020', STORE_FORM, true);
$this->assertEquals('CEST', $eval->substitute('start:F:all:t', $foundInStore));
}
/**
*/
protected function setUp() {
......
......@@ -8,7 +8,6 @@
namespace IMATHUZH\Qfq\Tests\Unit\Core\Helper;
use IMATHUZH\Qfq\Core\Helper\OnString;
use PHPUnit\Framework\TestCase;
......@@ -200,4 +199,89 @@ class OnStringTest extends TestCase {
public function testRemoveNewlinesInNestedExpression_missingOpening_3() {
$str = OnString::removeNewlinesInNestedExpression("{{Test}}}}");
}
/**
* @throws \CodeException
* @throws \DbException
* @throws \UserFormException
* @throws \UserReportException
*/
public function testGetEuropeanTimezone() {
// It seems in phpunit there is no default time zone set - set it manually.
date_default_timezone_set('Europe/Berlin');
# Check 2020 incl. hour
$this->assertEquals('CET', OnString::getEuropeanTimezone('29.03.2020 01:00'));
$this->assertEquals('CEST', OnString::getEuropeanTimezone('29.03.2020 03:00'));
$this->assertEquals('CEST', OnString::getEuropeanTimezone('25.10.2020 01:00'));
$this->assertEquals('CET', OnString::getEuropeanTimezone('25.10.2020 03:00'));
# Check 2021 incl. hour
$this->assertEquals('CET', OnString::getEuropeanTimezone('28.03.2021 01:00'));
$this->assertEquals('CEST', OnString::getEuropeanTimezone('28.03.2021 03:00'));
$this->assertEquals('CEST', OnString::getEuropeanTimezone('31.10.2021 01:00'));
$this->assertEquals('CET', OnString::getEuropeanTimezone('31.10.2021 03:00'));
# Check 2021 only date
$this->assertEquals('CET', OnString::getEuropeanTimezone('28.03.2021'));
$this->assertEquals('CEST', OnString::getEuropeanTimezone('29.03.2021'));
$this->assertContains(OnString::getEuropeanTimezone(''), ['CET', 'CEST']);
# Check if action parameter 't' is recognized.
// $this->store->setVar('start', '02.06.2020', STORE_FORM, true);
// $this->assertEquals('CEST', $eval->substitute('start:F:all:t', $foundInStore));
}
/**
*
*/
public function testEscapeSingleTickInHtml() {
$this->assertEquals('<b>hello</b>', OnString::escapeSingleTickInHtml('<b>hello</b>'));
$this->assertEquals("<b>hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b>hel'lo</b>"));
$this->assertEquals('<b>hel"lo</b>', OnString::escapeSingleTickInHtml('<b>hel"lo</b>'));
$this->assertEquals('<b>hel&apos;l"o</b>', OnString::escapeSingleTickInHtml('<b>hel\'l"o</b>'));
$this->assertEquals("<b title=test>hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title=test>hel'lo</b>"));
$this->assertEquals("<b title = test > hel&apos;lo </b>", OnString::escapeSingleTickInHtml("<b title = test > hel'lo </b>"));
$this->assertEquals("<b title=\"test\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title='test'>hel'lo</b>"));
$this->assertEquals("<b title = \"test\" > hel&apos;lo </b>", OnString::escapeSingleTickInHtml("<b title = 'test' > hel'lo </b>"));
$this->assertEquals("<b title=\"test\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title=\"test\">hel'lo</b>"));
$this->assertEquals("<b title= \"test\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= 'test'>hel'lo</b>"));
$this->assertEquals("<b title= \"test\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= \"test\">hel'lo</b>"));
$this->assertEquals("<b title=\"test\" >hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title=\"test\" >hel'lo</b>"));
$this->assertEquals("<b title= \"test\" >hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= \"test\" >hel'lo</b>"));
$this->assertEquals("<b title=\"te&apos;st\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title=\"te'st\">hel'lo</b>"));
$this->assertEquals("<b title= \"te&apos;st\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= \"te'st\">hel'lo</b>"));
$this->assertEquals("<b title= \"te&apos;st\" >hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= \"te'st\" >hel'lo</b>"));
$this->assertEquals("<b title=\"te&quot;st\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title='te\"st'>hel'lo</b>"));
$this->assertEquals("<b title= \"te&quot;st\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= 'te\"st'>hel'lo</b>"));
$this->assertEquals("<b title= \"te&quot;st\" >hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b title= 'te\"st' >hel'lo</b>"));
$this->assertEquals("<b src=gif title=\"test\" alt=jpg>hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=gif title='test' alt=jpg>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"test\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src='gif' title='test' alt='jpg'>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"test\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=\"gif\" title='test' alt='jpg'>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"test\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src='gif' title='test' alt=\"jpg\">hel'lo</b>"));
$this->assertEquals("<b src=gif title=\"te&quot;st\" alt=jpg>hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=gif title='te\"st' alt=jpg>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"te&quot;st\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src='gif' title='te\"st' alt=\"jpg\">hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"te&quot;st\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=\"gif\" title='te\"st' alt='jpg'>hel'lo</b>"));
$this->assertEquals("<b src=gif title=\"te&apos;st\" alt=jpg>hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=gif title=\"te'st\" alt=jpg>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"te&apos;st\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src='gif' title=\"te'st\" alt='jpg'>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"te&apos;st\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src=\"gif\" title=\"te'st\" alt='jpg'>hel'lo</b>"));
$this->assertEquals("<b src=\"gif\" title=\"te&apos;st\" alt=\"jpg\">hel&apos;lo</b>", OnString::escapeSingleTickInHtml("<b src='gif' title=\"te'st\" alt=\"jpg\">hel'lo</b>"));
$expected = "<img src=\"pig.gif\" title=\"Pig\"><img src=\"sun.gif\" title=\"Sun\">";
$this->assertEquals($expected, OnString::escapeSingleTickInHtml("<img src='pig.gif' title='Pig'><img src='sun.gif' title='Sun'>"));
$expected = "<img src=\"pig.gif\" title=\"Pig &quot;blue&quot;\"><img src=\"sun.gif\" title=\"Sun &quot;bright&quot;\">";
$this->assertEquals($expected, OnString::escapeSingleTickInHtml("<img src='pig.gif' title='Pig \"blue\"'><img src='sun.gif' title='Sun \"bright\"'>"));
}
}
\ No newline at end of file
......@@ -1435,7 +1435,6 @@ EOF;
10.10.tail = Dynamic tail
10.10.althead = No record found
10.10.altsql = SELECT 'alt sql fired'
EOF;
$result = $this->report->process($line);
......@@ -1443,6 +1442,76 @@ EOF;
$this->assertEquals($expect, $result);
}
/**
* @throws \CodeException
* @throws \DbException
* @throws \DownloadException
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
* @throws \UserFormException
* @throws \UserReportException
*/
public function testReportContent() {
$line = <<<EOF
10.sql = SELECT 'Hello'
20.sql = SELECT 'World'
20.tail = {{10.line.content}}
EOF;
$result = $this->report->process($line);
$expect = "HelloWorld{{10.line.content}}";
$this->assertEquals($expect, $result);
$line = <<<EOF
10.sql = SELECT 'Hello'
10.content = hide
20.sql = SELECT 'World'
20.tail = {{10.line.content}}
EOF;
$result = $this->report->process($line);
$expect = "WorldHello";
$this->assertEquals($expect, $result);
$line = <<<EOF
10.sql = SELECT 'Hello'
10.content = show
20.sql = SELECT 'World'
20.tail = {{10.line.content}}
EOF;
$result = $this->report->process($line);
$expect = "HelloWorldHello";
$this->assertEquals($expect, $result);
// Check that current row can be reused in head, tail, rbeg, rend, renr
$line = <<<EOF
10.sql = SELECT 'Hello'
10.content = show
10.head = {{10.line.content}}
10.tail = {{10.line.content}}
10.rbeg = {{10.line.content}}
10.rend = {{10.line.content}}
10.renr = {{10.line.content}}
EOF;
$result = $this->report->process($line);
$expect = "HelloHelloHelloHelloHelloHello";
$this->assertEquals($expect, $result);
// Check single tick escape
$line = <<<EOF
10.sql = SELECT "Hel'lo"
10.content = hide
20.sql = SELECT '--{{10.line.content::s}}--', "--{{10.line.content}}--", "--{{10.line.content::s}}--"
EOF;
$result = $this->report->process($line);
$expect = "--Hel'lo----Hel'lo----Hel'lo--";
$this->assertEquals($expect, $result);
}
/**
* @throws \CodeException
* @throws \DbException
......@@ -1470,7 +1539,6 @@ EOF;
10.fend = </td>
10.fsep = ++
10.fskipwrap = 1,3
EOF;
$result = $this->report->process($line);
......@@ -1505,7 +1573,6 @@ EOF;
10.fend = </td>
10.fsep = ++
10.fskipwrap = 3
EOF;
$result = $this->report->process($line);
......
......@@ -418,6 +418,7 @@ class StoreTest extends TestCase {
SYSTEM_CMD_GS => 'gs',
SYSTEM_CMD_PDFUNITE => 'pdfunite',
SYSTEM_CMD_IMG2PDF => 'img2pdf',
SYSTEM_CMD_HEIF_CONVERT => 'heif-convert',
];
$body = json_encode([
......
......@@ -40,12 +40,15 @@ cmdQpdf = qpdf
# cat=config/config; type=string; label=Command 'gs':Default is 'gs'. Will be used to decrypt and to convert PDF to PDF (try to repair) if merging of PDF fails.
cmdGs = gs
# cat=config/config; type=string; label=Command 'pdfunite':Default is 'pdfunite'. Will be used to merge PDFs.
# cat=config/config; type=string; label=Command 'pdfunite':Default is 'pdfunite'. Will be used to merge PDF.
cmdPdfunite = pdfunite
# cat=config/config; type=string; label=Command 'img2pdf':Default is 'img2pdf'. Will be used to convert images to PDFs.
# cat=config/config; type=string; label=Command 'img2pdf':Default is 'img2pdf'. Will be used to convert images to PDF.
cmdImg2pdf = img2pdf
# cat=config/config; type=string; label=Command 'heif-convert':Default is 'heif-convert'. Will be used to convert images from HEIC/HEIF to PNG.
cmdHeifConvert = heif-convert
# cat=config/email; type=string; label=Options for SendEMail:Default is empty. General options. Check: http://caspian.dotconf.net/menu/Software/SendEmail. E.g.: 'sendEMail=-o tls=yes'
sendEMailOptions =
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment