Handle pasting disallowed clipboard contents on iOS

When another app owns the current clipboard contents, pasting
will display a "allow or disallow" dialog. If the disallow
option is selected, the data from the UIPasteboard will be
garbage and GetLOKNotifier() will return a nullptr. Since calling
SetLOKNotifier() with a nullptr aborts in an assert(), fix the
crash by failing gracefully.

Also, throw an exception if the -[UIPasteboard dataForPasteboardType:]
returns nil. By throwing an exception,  the "allow or disallow"
dialog will display again the next time the user tries to paste.

Change-Id: I05d689b679a7643a8478e3ce0f416205fdf8ec23
Reference-to: https://github.com/CollaboraOnline/online/issues/5908
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148655
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
(cherry picked from commit 1dd68786a927a23e5465589025abd90b8c9f4e7b)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148627
Tested-by: Jenkins
Reviewed-by: Patrick Luby <plubius@neooffice.org>
This commit is contained in:
Patrick Luby 2023-03-10 12:11:25 -05:00 committed by Patrick Luby
parent 34510e6e57
commit b0b8815fff
2 changed files with 23 additions and 0 deletions

View File

@ -109,6 +109,16 @@ Any SAL_CALL iOSTransferable::getTransferData(const DataFlavor& aFlavor)
DataProviderPtr_t dp;
NSData* sysData = [[UIPasteboard generalPasteboard] dataForPasteboardType:sysFormat];
if (!sysData)
{
// Related: gh#5908 throw an exception if the data flavor is nil
// If nil is returned, it can mean that the user has selected the
// "disallow" option and so we can't access the current clipboard
// contents. Also, by throwing an exception, the "allow or disallow"
// dialog will display again the next time the user tries to paste.
throw UnsupportedFlavorException("Data flavor is nil", static_cast<XTransferable*>(this));
}
dp = DataFlavorMapper::getDataProvider(sysFormat, sysData);
if (dp.get() == nullptr)

View File

@ -926,7 +926,20 @@ bool Dialog::ImplStartExecute()
if (bModal)
{
if (bKitActive && !GetLOKNotifier())
{
#ifdef IOS
// gh#5908 handle pasting disallowed clipboard contents on iOS
// When another app owns the current clipboard contents, pasting
// will display a "allow or disallow" dialog. If the disallow
// option is selected, the data from the UIPasteboard will be
// garbage and we will find ourselves here. Since calling
// SetLOKNotifier() with a nullptr aborts in an assert(), fix
// the crash by failing gracefully.
return false;
#else
SetLOKNotifier(mpDialogImpl->m_aInstallLOKNotifierHdl.Call(nullptr));
#endif
}
switch ( Application::GetDialogCancelMode() )
{