Compare commits
4
Commits
ce0b6ccbc7
...
9abacef435
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9abacef435 | ||
|
|
d485640f57 | ||
|
|
2e3859795f | ||
|
|
9d268c967e |
No files matched your search
+2
-1
@@ -29,7 +29,8 @@
|
|||||||
"Organizer contains invalid characters.": "Der Organisator enthält ungültige Zeichen.",
|
"Organizer contains invalid characters.": "Der Organisator enthält ungültige Zeichen.",
|
||||||
"Invalid organizer email address.": "Ungültige E-Mail-Adresse des Organisators.",
|
"Invalid organizer email address.": "Ungültige E-Mail-Adresse des Organisators.",
|
||||||
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "In deinem Konto wurde kein beschreibbarer Kalender gefunden. Erstelle einen in der Nextcloud-Kalender-App und versuche es erneut.",
|
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "In deinem Konto wurde kein beschreibbarer Kalender gefunden. Erstelle einen in der Nextcloud-Kalender-App und versuche es erneut.",
|
||||||
"The selected calendar is no longer writable. Pick another one and try again.": "Der ausgewählte Kalender ist nicht mehr beschreibbar. Wähle einen anderen aus und versuche es erneut."
|
"The selected calendar is no longer writable. Pick another one and try again.": "Der ausgewählte Kalender ist nicht mehr beschreibbar. Wähle einen anderen aus und versuche es erneut.",
|
||||||
|
"The event could not be created. Please try again.": "Das Meeting konnte nicht erstellt werden. Bitte versuche es erneut."
|
||||||
},
|
},
|
||||||
"pluralForms": "nplurals=2; plural=(n != 1);"
|
"pluralForms": "nplurals=2; plural=(n != 1);"
|
||||||
}
|
}
|
||||||
+2
-1
@@ -29,7 +29,8 @@
|
|||||||
"Organizer contains invalid characters.": "Der Organisator enthält ungültige Zeichen.",
|
"Organizer contains invalid characters.": "Der Organisator enthält ungültige Zeichen.",
|
||||||
"Invalid organizer email address.": "Ungültige E-Mail-Adresse des Organisators.",
|
"Invalid organizer email address.": "Ungültige E-Mail-Adresse des Organisators.",
|
||||||
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "In Ihrem Konto wurde kein beschreibbarer Kalender gefunden. Erstellen Sie einen in der Nextcloud-Kalender-App und versuchen Sie es erneut.",
|
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "In Ihrem Konto wurde kein beschreibbarer Kalender gefunden. Erstellen Sie einen in der Nextcloud-Kalender-App und versuchen Sie es erneut.",
|
||||||
"The selected calendar is no longer writable. Pick another one and try again.": "Der ausgewählte Kalender ist nicht mehr beschreibbar. Wählen Sie einen anderen aus und versuchen Sie es erneut."
|
"The selected calendar is no longer writable. Pick another one and try again.": "Der ausgewählte Kalender ist nicht mehr beschreibbar. Wählen Sie einen anderen aus und versuchen Sie es erneut.",
|
||||||
|
"The event could not be created. Please try again.": "Das Meeting konnte nicht erstellt werden. Bitte versuchen Sie es erneut."
|
||||||
},
|
},
|
||||||
"pluralForms": "nplurals=2; plural=(n != 1);"
|
"pluralForms": "nplurals=2; plural=(n != 1);"
|
||||||
}
|
}
|
||||||
+2
-1
@@ -29,7 +29,8 @@
|
|||||||
"Organizer contains invalid characters.": "Organizer contains invalid characters.",
|
"Organizer contains invalid characters.": "Organizer contains invalid characters.",
|
||||||
"Invalid organizer email address.": "Invalid organizer email address.",
|
"Invalid organizer email address.": "Invalid organizer email address.",
|
||||||
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.",
|
"No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.": "No writable calendar was found in your account. Create one in the Nextcloud Calendar app, then try again.",
|
||||||
"The selected calendar is no longer writable. Pick another one and try again.": "The selected calendar is no longer writable. Pick another one and try again."
|
"The selected calendar is no longer writable. Pick another one and try again.": "The selected calendar is no longer writable. Pick another one and try again.",
|
||||||
|
"The event could not be created. Please try again.": "The event could not be created. Please try again."
|
||||||
},
|
},
|
||||||
"pluralForms": "nplurals=2; plural=(n != 1);"
|
"pluralForms": "nplurals=2; plural=(n != 1);"
|
||||||
}
|
}
|
||||||
@@ -4,32 +4,9 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace OCA\AToCal\AppInfo;
|
namespace OCA\AToCal\AppInfo;
|
||||||
|
|
||||||
use OCA\AToCal\Controller\CalendarController;
|
|
||||||
use OCP\AppFramework\App;
|
use OCP\AppFramework\App;
|
||||||
use OCP\AppFramework\IAppContainer;
|
|
||||||
|
|
||||||
class Application extends App
|
class Application extends App
|
||||||
{
|
{
|
||||||
public const APP_ID = 'atocal';
|
public const APP_ID = 'atocal';
|
||||||
|
|
||||||
public function __construct(array $urlParams = [])
|
|
||||||
{
|
|
||||||
parent::__construct(self::APP_ID, $urlParams);
|
|
||||||
|
|
||||||
$container = $this->getContainer();
|
|
||||||
|
|
||||||
$container->registerService(
|
|
||||||
CalendarController::class,
|
|
||||||
function (IAppContainer $c): CalendarController {
|
|
||||||
return new CalendarController(
|
|
||||||
self::APP_ID,
|
|
||||||
$c->get(\OCP\IRequest::class),
|
|
||||||
$c->get(\OCP\Calendar\IManager::class),
|
|
||||||
$c->get(\OCP\IUserSession::class),
|
|
||||||
$c->get(\OCP\IURLGenerator::class),
|
|
||||||
$c->get(\OCP\IDateTimeZone::class)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,7 @@ use OCP\IURLGenerator;
|
|||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use OCP\IDateTimeZone;
|
use OCP\IDateTimeZone;
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
use Sabre\VObject\Reader;
|
use Sabre\VObject\Reader;
|
||||||
|
|
||||||
class CalendarController extends Controller
|
class CalendarController extends Controller
|
||||||
@@ -67,6 +68,7 @@ class CalendarController extends Controller
|
|||||||
private IURLGenerator $urlGenerator;
|
private IURLGenerator $urlGenerator;
|
||||||
private IDateTimeZone $dateTimeZone;
|
private IDateTimeZone $dateTimeZone;
|
||||||
private IL10N $l10n;
|
private IL10N $l10n;
|
||||||
|
private LoggerInterface $logger;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
string $appName,
|
string $appName,
|
||||||
@@ -76,7 +78,8 @@ class CalendarController extends Controller
|
|||||||
IUserSession $userSession,
|
IUserSession $userSession,
|
||||||
IURLGenerator $urlGenerator,
|
IURLGenerator $urlGenerator,
|
||||||
IDateTimeZone $dateTimeZone,
|
IDateTimeZone $dateTimeZone,
|
||||||
IL10N $l10n
|
IL10N $l10n,
|
||||||
|
LoggerInterface $logger
|
||||||
) {
|
) {
|
||||||
parent::__construct($appName, $request);
|
parent::__construct($appName, $request);
|
||||||
|
|
||||||
@@ -86,6 +89,7 @@ class CalendarController extends Controller
|
|||||||
$this->urlGenerator = $urlGenerator;
|
$this->urlGenerator = $urlGenerator;
|
||||||
$this->dateTimeZone = $dateTimeZone;
|
$this->dateTimeZone = $dateTimeZone;
|
||||||
$this->l10n = $l10n;
|
$this->l10n = $l10n;
|
||||||
|
$this->logger = $logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -202,7 +206,27 @@ class CalendarController extends Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->createEvent($calendar, $data);
|
/*
|
||||||
|
* Backend failures, e.g. CalendarException, must not end
|
||||||
|
* in a generic 500 page. Log the cause, re-render the form.
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
$this->createEvent($calendar, $data);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
$this->logger->error(
|
||||||
|
'Failed to create calendar event: ' . $e->getMessage(),
|
||||||
|
['exception' => $e]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->renderConfirm(
|
||||||
|
$data,
|
||||||
|
$calendars,
|
||||||
|
$calendarId,
|
||||||
|
$this->l10n->t(
|
||||||
|
'The event could not be created. Please try again.'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open the Nextcloud Calendar application if enabled,
|
* Open the Nextcloud Calendar application if enabled,
|
||||||
@@ -535,11 +559,22 @@ class CalendarController extends Controller
|
|||||||
|
|
||||||
private function assertHttpsUrl(string $value, string $message): void
|
private function assertHttpsUrl(string $value, string $message): void
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* filter_var() plus the regex reject whitespace, backslashes
|
||||||
|
* and non-ASCII characters: browsers may display those
|
||||||
|
* differently than PHP parses them, e.g. IDN homographs.
|
||||||
|
*/
|
||||||
|
if (filter_var($value, FILTER_VALIDATE_URL) === false
|
||||||
|
|| preg_match('/[^\x21-\x7E]|\\\\/', $value) === 1) {
|
||||||
|
throw new \InvalidArgumentException($message);
|
||||||
|
}
|
||||||
|
|
||||||
$parts = parse_url($value);
|
$parts = parse_url($value);
|
||||||
|
|
||||||
$valid = $parts !== false
|
$valid = $parts !== false
|
||||||
&& isset($parts['scheme'], $parts['host'])
|
&& isset($parts['scheme'], $parts['host'])
|
||||||
&& !isset($parts['user'])
|
&& !isset($parts['user'])
|
||||||
|
&& !isset($parts['pass'])
|
||||||
&& strtolower($parts['scheme']) === 'https'
|
&& strtolower($parts['scheme']) === 'https'
|
||||||
&& $parts['host'] !== '';
|
&& $parts['host'] !== '';
|
||||||
|
|
||||||
@@ -595,7 +630,11 @@ class CalendarController extends Controller
|
|||||||
/**
|
/**
|
||||||
* Reject invalid UTF-8 and control characters. Newlines
|
* Reject invalid UTF-8 and control characters. Newlines
|
||||||
* (\n, \r) are only allowed where multi-line text is
|
* (\n, \r) are only allowed where multi-line text is
|
||||||
* expected, e.g. the description.
|
* expected, e.g. the description. Also rejects Unicode
|
||||||
|
* spoofing characters: bidi overrides and line separators
|
||||||
|
* can make text display misleadingly. Format characters
|
||||||
|
* like the zero-width joiner (U+200D) stay allowed, emoji
|
||||||
|
* sequences need them.
|
||||||
*/
|
*/
|
||||||
private function assertClean(string $v, string $msg, bool $allowNewlines = false): void
|
private function assertClean(string $v, string $msg, bool $allowNewlines = false): void
|
||||||
{
|
{
|
||||||
@@ -603,7 +642,13 @@ class CalendarController extends Controller
|
|||||||
? '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/'
|
? '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/'
|
||||||
: '/[\x00-\x1F\x7F]/';
|
: '/[\x00-\x1F\x7F]/';
|
||||||
|
|
||||||
if (!mb_check_encoding($v, 'UTF-8') || preg_match($re, $v) === 1) {
|
if (!mb_check_encoding($v, 'UTF-8')
|
||||||
|
|| preg_match($re, $v) === 1
|
||||||
|
|| preg_match(
|
||||||
|
'/[\x{202A}-\x{202E}\x{2066}-\x{2069}\x{2028}\x{2029}\x{0085}]/u',
|
||||||
|
$v
|
||||||
|
) === 1
|
||||||
|
) {
|
||||||
throw new \InvalidArgumentException($msg);
|
throw new \InvalidArgumentException($msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user